/**
 * 密码强度校验工具类
 */
interface ValidationResult {
  valid: boolean;
  message: string;
}

interface StrengthLevel {
  level: '弱' | '中' | '强';
  className: 'weak' | 'medium' | 'strong';
  color: string;
}

export default class PasswordValidator {
  // 最小密码长度
  static readonly MIN_LENGTH: number = 8;
  // 最大密码长度
  static readonly MAX_LENGTH: number = 20;
  // 用户名正则表达式
  static readonly USERNAME_PATTERN: RegExp = /^[a-zA-Z0-9_]{4,20}$/;
  // 包含数字的正则
  static readonly DIGIT_PATTERN: RegExp = /\d/;
  // 包含小写字母的正则
  static readonly LOWERCASE_PATTERN: RegExp = /[a-z]/;
  // 包含大写字母的正则
  static readonly UPPERCASE_PATTERN: RegExp = /[A-Z]/;
  // 包含特殊字符的正则
  static readonly SPECIAL_CHAR_PATTERN: RegExp = /[~!@#$%^&*()_+\-={}[\]|;:,.<>/?]/;

  /**
   * 校验用户名是否符合要求
   * @param username 待校验的用户名
   * @returns 校验结果，包含校验状态和消息
   */
  static validateUsername(username: string): ValidationResult {
    if (!username || username.length === 0) {
      return { valid: false, message: '用户名不能为空' };
    }

    if (!this.USERNAME_PATTERN.test(username)) {
      return { 
        valid: false, 
        message: '用户名只能包含字母、数字和下划线，长度在4-20个字符之间' 
      };
    }

    return { valid: true, message: '用户名格式正确' };
  }

  /**
   * 校验密码是否符合强度要求
   * @param password 待校验的密码
   * @returns 校验结果，包含校验状态和消息
   */
  static validate(password: string): ValidationResult {
    if (!password || password.length === 0) {
      return { valid: false, message: '密码不能为空' };
    }

    // 检查密码长度
    if (password.length < this.MIN_LENGTH || password.length > this.MAX_LENGTH) {
      return { 
        valid: false, 
        message: `密码长度必须在${this.MIN_LENGTH}到${this.MAX_LENGTH}个字符之间` 
      };
    }

    // 检查是否包含空格
    if (password.includes(' ')) {
      return { valid: false, message: '密码不能包含空格' };
    }

    // 至少满足三项：数字、小写字母、大写字母、特殊字符
    let conditionsMet = 0;

    if (this.DIGIT_PATTERN.test(password)) {
      conditionsMet++;
    }

    if (this.LOWERCASE_PATTERN.test(password)) {
      conditionsMet++;
    }

    if (this.UPPERCASE_PATTERN.test(password)) {
      conditionsMet++;
    }

    if (this.SPECIAL_CHAR_PATTERN.test(password)) {
      conditionsMet++;
    }

    if (conditionsMet < 3) {
      return { 
        valid: false, 
        message: '密码必须包含数字、小写字母、大写字母、特殊字符中的至少三种' 
      };
    }

    return { valid: true, message: '密码格式正确' };
  }

  /**
   * 获取密码强度评分（0-100）
   * @param password 密码
   * @returns 密码强度分数
   */
  static getStrengthScore(password: string): number {
    if (!password || password.length === 0) return 0;

    let score = 0;

    // 基础长度分数（最大40分）
    const lengthScore = Math.min(40, (password.length / this.MAX_LENGTH) * 40);
    score += lengthScore;

    // 复杂度分数（每项最大15分，共60分）
    if (this.DIGIT_PATTERN.test(password)) score += 15;
    if (this.LOWERCASE_PATTERN.test(password)) score += 15;
    if (this.UPPERCASE_PATTERN.test(password)) score += 15;
    if (this.SPECIAL_CHAR_PATTERN.test(password)) score += 15;

    return Math.min(100, score);
  }

  /**
   * 获取密码强度级别描述
   * @param score 密码强度分数
   * @returns 强度级别对象，包含级别和对应的类名和颜色
   */
  static getStrengthLevel(score: number): StrengthLevel {
    if (score < 40) {
      return { level: '弱', className: 'weak', color: '#ff4d4f' };
    } else if (score < 70) {
      return { level: '中', className: 'medium', color: '#faad14' };
    } else {
      return { level: '强', className: 'strong', color: '#52c41a' };
    }
  }
} 